



#ifndef _C_GRAPHICS_H_
#define _C_GRAPHICS_H_

#include"gl_GraphicsDevice.h"
#include"gl_Color.h"
#include"stl_.h"

#define GraphicsDevice_width   800 // 128   // 320 // 600 
#define GraphicsDevice_height  800 // 128   // 480		  





/// <summary>
/// 图标结构体。本质就是image 的const版。
/// </summary>
typedef struct __t_icon__
{
	const COLOR_RGB* buffer;  // 颜色点阵，这个数组长度是width*height
	int width;
	int height;
}icon;

/// <summary>
/// 图标结构体初始化。
/// </summary>
/// <param name="ic"></param>
/// <param name="buffer"> 已经定义好的图标图片的数组，长度是w*h</param>
/// <param name="w">图像宽度</param>
/// <param name="h">图像高度</param>
void icon_init(icon* ic, const COLOR_RGB* buffer, int w, int h);

typedef struct _image_
{
	COLOR_RGB* buffer;  // 颜色点阵，这个数组长度是width*height
	int width;
	int height;
}image;

/// <summary>
/// 图像结构体初始化。
/// </summary>
/// <param name="im">图像区域</param>
/// <param name="buffer"> 已经分配好的数组，长度是w*h</param>
/// <param name="w">图像宽度</param>
/// <param name="h">图像高度</param>
void image_init(image* im, COLOR_RGB* buffer, int w, int h);

/// <summary>
/// 将图标复制到图片。 >> 从ic的left，top位置，截取im.width,im.height的区域复制给im
/// </summary>
/// <param name="ic">图标资源</param>
/// <param name="im">图片</param>
/// <param name="left">复制的图标资源左侧位置</param>
/// <param name="top">复制的图标资源右侧位置</param>
/// <param name="back_color">背景颜色，超出图标范围的区域用背景色填充</param>
void icon_copyto_image(icon ic, image im, int left, int top, COLOR_RGB back_color);



/// <summary>
/// 绘制竖直线
/// </summary>
/// <param name="x">竖线的x坐标，是线宽的中点坐标</param>
/// <param name="y0">竖线的y轴起点</param>
/// <param name="y1">竖线的y轴终点</param>
/// <param name="width">线的宽度</param>
/// <param name="color">线条颜色</param>
void draw_line_vertical(int x, int y0, int y1, int width, COLOR_RGB color);

/// <summary>
/// 绘制水平线
/// </summary>
/// <param name="y">水平线y坐标，是线宽的中点坐标</param>
/// <param name="x0">水平线x轴起点坐标</param>
/// <param name="x1">水平线x轴终点坐标</param>
/// <param name="width">线的宽度</param>
/// <param name="color">线条颜色</param>
void draw_line_horizontal(int y, int x0, int x1, int width, COLOR_RGB color);



/// <summary>
/// 绘制射线。用中点Bresenham算法。这里的绘制长度固定是len.
/// line_segment：线段
/// ray: 射线
/// </summary>
/// <param name="x0">射线的起点x轴坐标</param>
/// <param name="y0">射线的起点y轴坐标</param>
/// <param name="dx">射线方向x分量</param>
/// <param name="dy">射线方向y分量</param>
/// <param name="len">绘制的射线长度</param>
/// <param name="color">线条颜色</param>
void draw_ray(int x0, int y0, int dx, int dy, int len, COLOR_RGB color);

/// <summary>
/// 绘制箭头，箭头方向从0到1。 箭头样式是固定的
/// 箭头夹角90度，箭头尺寸5个像素。
/// </summary>
/// <param name="x0">线的起点x轴坐标</param>
/// <param name="y0">线的起点y轴坐标</param>
/// <param name="x1">线的终点x轴坐标</param>
/// <param name="y1">线的终点y轴坐标</param>
/// <param name="color">线条颜色</param>
void draw_arrow(int x0, int y0, int x1, int y1, COLOR_RGB color);



/// 这里的绘制函数要保证运算速度，不做越界判断与处理。


/// <summary>
/// 画线函数。用中点Bresenham算法。
/// </summary>
/// <param name="x0">线的起点x轴坐标</param>
/// <param name="y0">线的起点y轴坐标</param>
/// <param name="x1">线的终点x轴坐标</param>
/// <param name="y1">线的终点y轴坐标</param>
/// <param name="color">线条颜色</param>
void draw_line(int x0, int y0, int x1, int y1, COLOR_RGB color);

/// <summary>
/// 画圆函数
/// </summary>
/// <param name="cx">圆心的x轴坐标</param>
/// <param name="cy">圆心的y轴坐标</param>
/// <param name="R">圆的半径</param>
/// <param name="color">圆的颜色</param>
void draw_circle(int cx, int cy, int R, COLOR_RGB color);


// 下面两个宏定义见参考draw_circle,draw_ring函数

#define Bresenham_circle_iterator_init(x,y,R) \
int x = 0, y = R, x##y##_d_0 = 0, x##y##_d_1 = 0, x##y##_d_ = 0;bool is_##x = true;

#define Bresenham_circle_iterator(x,y) \
if (x <= y) {\
	x##y##_d_0 = x##y##_d_ + (x << 1) + 1;x##y##_d_1 = x##y##_d_ + 2 - ((y - x) << 1);x++;\
	if (x##y##_d_0 + x##y##_d_1 > 0) {x##y##_d_ = x##y##_d_1;	y--;}else {	x##y##_d_ = x##y##_d_0;} }\
else {\
	x##y##_d_0 = x##y##_d_ - (y << 1) + 1;x##y##_d_1 = x##y##_d_ + 2 - ((y - x) << 1);y--;\
	if (x##y##_d_0 + x##y##_d_1 < 0) {x##y##_d_ = x##y##_d_1;x++; is_##x = true;}else {x##y##_d_ = x##y##_d_0; is_##x = false;} }


/// <summary>
/// 画实心圆函数
/// </summary>
/// <param name="cx">圆心的x轴坐标</param>
/// <param name="cy">圆心的y轴坐标</param>
/// <param name="R">圆的半径</param>
/// <param name="color">圆的颜色</param>
void draw_solidcircle(int cx, int cy, int R, COLOR_RGB color);

/// <summary>
/// 绘制圆环  Bresenham_circle_iterator_init
/// </summary>
/// <param name="cx">圆心中点x坐标</param>
/// <param name="cy">圆心中点y坐标</param>
/// <param name="r1">圆心第一个半径</param>
/// <param name="r2">圆环第二个半径</param>
/// <param name="fill_color">圆环半径之间的填充色</param>
void draw_ring(int cx, int cy, int r1, int r2, COLOR_RGB fill_color);

/// <summary>
/// 绘制实心圆角矩形，无边框
/// </summary>
/// <param name="left">圆角矩形左边界</param>
/// <param name="top">圆角矩形右边界</param>
/// <param name="w">圆角矩形的宽</param>
/// <param name="h">圆角矩形的高</param>
/// <param name="r">圆角半径</param>
/// <param name="fill_color">填充颜色</param>
void draw_solidroundedrectangle(int left, int top, int w, int h,
	int r, COLOR_RGB fill_color);


/// <summary>
/// 绘制圆角矩形。可以设定圆角半径，边框的线宽，边框颜色，填充颜色,是否填充。
/// 主要用在绘制UI控件上。
/// 绘制的区域由left,  top,  w,  h 决定。
/// </summary>
/// <param name="left">圆角矩形左边界</param>
/// <param name="top">圆角矩形右边界</param>
/// <param name="w">圆角矩形的宽</param>
/// <param name="h">圆角矩形的高</param>
/// <param name="r">圆角半径</param>
/// <param name="r">圆角半径</param>
/// <param name="fill_color">填充颜色</param>
/// <param name="fill_color">填充颜色</param>
void draw_roundedrectangle(int left, int top, int w, int h,
	int r,int line_width,COLOR_RGB line_color);


/// <summary>
/// 画长方形函数
/// </summary>
/// <param name="left">长方形的左边x轴坐标</param>
/// <param name="top">长方形的上边y轴坐标</param>
/// <param name="w">长方形的宽</param>
/// <param name="h">长方形的高</param>
/// <param name="color">长方形的颜色</param>
void draw_rectangle(int left, int top, int w, int h, COLOR_RGB color);

/// <summary>
/// 画实心长方形函数
/// </summary>
/// <param name="left">长方形的左边x轴坐标</param>
/// <param name="top">长方形的上边y轴坐标</param>
/// <param name="w">长方形的宽</param>
/// <param name="h">长方形的高</param>
/// <param name="color">长方形的颜色</param>
void draw_solidrectangle(int left, int top, int w, int h, COLOR_RGB color);

/// <summary>
/// 画三角形函数。坐标数组取前三个元素。
/// </summary>
/// <param name="pointsx">顶点的x轴坐标数组</param>
/// <param name="pointsy">顶点的y轴坐标数组</param>
/// <param name="color">三角形颜色</param>
void draw_triangle(int* pointsx, int* pointsy, COLOR_RGB color);

/// <summary>
/// 绘制多边形函数。
/// </summary>
/// <param name="pointsx">顶点的x轴坐标数组</param>
/// <param name="pointsy">顶点的y轴坐标数组</param>
/// <param name="num">多边形顶点数量</param>
/// <param name="color">多边形颜色</param>
void draw_polygon(int* pointsx, int* pointsy, int num, COLOR_RGB color);
//

/// <summary>
/// 画实心长方形图标。
/// 颜色数组，从左到右，从上到下，到了宽度自动换行，数组长度是w*h。
/// </summary>
/// <param name="left">长方形的左边x轴坐标</param>
/// <param name="top">长方形的上边y轴坐标</param>
/// <param name="w">长方形的宽</param>
/// <param name="h">长方形的高</param>
/// <param name="color">颜色数组</param>
void draw_icon(int left, int top, int w, int h, const COLOR_RGB* color);











/// 绘图库测试函数
//测试绘图函数
int test_graphics(void);




#endif








